package ar.edu.caece.dns.modelo;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;

import ar.edu.caece.dns.modelo.registros.NombreDominio;
import ar.edu.caece.dns.modelo.registros.RegistroRecurso;
import ar.edu.caece.dns.modelo.registros.TipoRegistro;

/**
 * Esta clase representa la estructura de datos que puede manejar un nodo del
 * DNS.
 * 
 * @author Lucas Jun 16, 2012 - 3:22:55 PM
 */
public class RepositorioRegistroImpl implements RepositorioRegistro {

	private Collection<RegistroRecurso> registros;

	private NombreDominio nombreDominio;

	public Collection<RegistroRecurso> getRegistros() {
		return registros;
	}

	public void setRegistros(Collection<RegistroRecurso> registros) {
		this.registros = registros;
	}

	public NombreDominio getNombreDominio() {
		return nombreDominio;
	}

	public void setNombreDominio(NombreDominio nombreDominio) {
		this.nombreDominio = nombreDominio;
	}

	@Override
	public Collection<RegistroRecurso> buscarPorTipoRegistro(
			TipoRegistro tipoRegistro) {

		Collection<RegistroRecurso> registrosEncontrados = new LinkedList<RegistroRecurso>();
		Iterator<RegistroRecurso> it = registros.iterator();

		while (it.hasNext()) {
			RegistroRecurso rr = it.next();

			if (rr.getTipoRegistro().equals(tipoRegistro)) {
				registrosEncontrados.add(rr);
			}
		}

		if (registrosEncontrados.size() != 0) {
			return registrosEncontrados;
		}

		return null;
	}

	@Override
	public Collection<RegistroRecurso> buscarPorTipoRegistroYNombreDominio(
			TipoRegistro tipoRegistro, NombreDominio nombreDominio) {

		Collection<RegistroRecurso> registrosEncontrados = new LinkedList<RegistroRecurso>();
		Iterator<RegistroRecurso> it = registros.iterator();

		while (it.hasNext()) {
			RegistroRecurso rr = it.next();

			if (rr.getTipoRegistro().equals(tipoRegistro)
					&& rr.getNombreDominio().equals(nombreDominio)) {

				registrosEncontrados.add(rr);
			}
		}

		if (registrosEncontrados.size() != 0) {
			return registrosEncontrados;
		}

		return null;
	}

	@Override
	public Collection<RegistroRecurso> buscarPorTipoRegistroYValor(
			TipoRegistro tipoRegistro, String valor) {
		
		Collection<RegistroRecurso> registrosEncontrados = new LinkedList<RegistroRecurso>();
		Iterator<RegistroRecurso> it = registros.iterator();

		while (it.hasNext()) {
			RegistroRecurso rr = it.next();

			if (rr.getTipoRegistro().equals(tipoRegistro)
					&& rr.getValor().equals(valor)) {

				registrosEncontrados.add(rr);
			}
		}

		if (registrosEncontrados.size() != 0) {
			return registrosEncontrados;
		}
		
		return null;
	}
	
	@Override
	public String toString() {
		
		StringBuffer sb = new StringBuffer("");
		
		sb.append("NombreDominio: ");
		sb.append(nombreDominio.toString());
		sb.append("\n");
		
		for (RegistroRecurso rr : registros) {
			sb.append("  R: ");
			sb.append(rr.toString());
			sb.append("\n");
		}
		
		return sb.toString();
	}
}
